﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using DDD.Core;

namespace DDD.OpenTK {
    /// <summary>
    /// <see cref="CompositeMode"/>に拡張メソッドを追加するクラス
    /// </summary>
    /// <remarks>
    /// 現在の実装ではカラーバッファー1,2,3への書き込みは対応していません。
    /// </remarks>
    public static class CompositeModeExtensions {

        /// <summary>
        /// コンパイル
        /// </summary>
        /// <param name="cmode"><see cref="CompositeMode"/>オブジェクト</param>
        public static void Compile (this CompositeMode cmode) {
            // nothing to do
        }

        /// <summary>
        /// レンダリング
        /// </summary>
        /// <param name="cmode"><see cref="CompositeMode"/>オブジェクト</param>
        public static void Render (this CompositeMode cmode) {


            var colorMaskA = ((cmode.ColorWriteMask & 0xff000000) == 0) ? false : true;
            var colorMaskR = ((cmode.ColorWriteMask & 0x00ff0000) == 0) ? false : true;
            var colorMaskG = ((cmode.ColorWriteMask & 0x0000ff00) == 0) ? false : true;
            var colorMaskB = ((cmode.ColorWriteMask & 0x000000ff) == 0) ? false : true;
            GL.ColorMask (colorMaskR, colorMaskG, colorMaskB, colorMaskA);

            var depthMask = (cmode.DepthWriteMask == 0) ? false : true;
            GL.DepthMask (depthMask);

            if (cmode.IsDepthTestEnabled)
                GL.Enable (EnableCap.DepthTest);
            else
                GL.Disable (EnableCap.DepthTest);

            var depthFunc = cmode.DepthComparisonFunction.ToGL ();
            GL.DepthFunc (depthFunc);
            
            var blendOp = cmode.ColorBlendFunction.ToGL1 ();
            var blendSrc = cmode.ColorBlendFunction.ToGL2 ();
            var blendDst = cmode.ColorBlendFunction.ToGL3 ();
            GL.Enable (EnableCap.Blend);
            GL.BlendEquation (blendOp);
            GL.BlendFunc (blendSrc, blendDst);
        }
    }
}
